<html>
<head><meta charset="utf-8"><title>Overriding the workspace feature set · t-compiler/rust-analyzer · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/index.html">t-compiler/rust-analyzer</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html">Overriding the workspace feature set</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="222307605"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222307605" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222307605">(Jan 11 2021 at 15:03)</a>:</h4>
<p>In <a href="https://github.com/nrf-rs/nrf-hal">nrf-hal</a>, we have several facade crates that all depend on one implementation crate, each enabling a different feature of it. rust-analyzer thus will always enable every feature when editing the implementation crate (nrf-hal-common), even if this is not enabled in the settings.</p>
<p>Because the features aren't additive (as is common in embedded crates), this causes things to break badly when editing, so only very few modules are actually picked up by r-a. Is there any way to disable this "feature merging" from <code>cargo metadata</code> (I assume)? Or should I write my own project.json?</p>



<a name="222307853"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222307853" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Laurențiu <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222307853">(Jan 11 2021 at 15:04)</a>:</h4>
<p>I guess <code>rust-analyzer.cargo.allFeatures</code> doesn't help here?</p>



<a name="222307972"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222307972" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222307972">(Jan 11 2021 at 15:05)</a>:</h4>
<p>It's already turned off</p>



<a name="222308986"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222308986" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222308986">(Jan 11 2021 at 15:12)</a>:</h4>
<p>hmm, seems like I have to manually specify where all dependencies are if I make use of <code>rust-project.json</code>, that's not going to work</p>



<a name="222309273"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222309273" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> bjorn3 <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222309273">(Jan 11 2021 at 15:14)</a>:</h4>
<p>When within a compilation graph a crate is depended on multiple times, the used feature set is the union of all the features that the individual dependent crates require. <code>cargo metadata</code> causes all crates in the current workspace to become part of the same compilation graph when run on a workspace <code>Cargo.toml</code> it seems, thus causing this feature unification.</p>



<a name="222309318"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222309318" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222309318">(Jan 11 2021 at 15:15)</a>:</h4>
<p>yeah</p>



<a name="222309392"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222309392" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> bjorn3 <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222309392">(Jan 11 2021 at 15:15)</a>:</h4>
<p>Same seems to happen for any member of a workspace.</p>



<a name="222309540"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222309540" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222309540">(Jan 11 2021 at 15:16)</a>:</h4>
<p>I wonder if we should just add a quickfix to the unconfigured-code diagnostic that modifies the <code>cfg</code> flags used for analysis</p>



<a name="222309564"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222309564" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222309564">(Jan 11 2021 at 15:16)</a>:</h4>
<p>With the caveat that <code>cargo check</code> is not affected</p>



<a name="222312777"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222312777" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222312777">(Jan 11 2021 at 15:36)</a>:</h4>
<p><span class="user-mention" data-user-id="211727">@Jonas Schievink</span> I think, fundamentally, we need to cajole <code>cargo metadata</code> into behaving how we want</p>



<a name="222312854"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222312854" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222312854">(Jan 11 2021 at 15:37)</a>:</h4>
<p>There's no good way to do that (even with the new resolver)</p>



<a name="222312982"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222312982" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222312982">(Jan 11 2021 at 15:38)</a>:</h4>
<p>yeah, its behavior makes sense to me here</p>



<a name="222313069"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313069" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313069">(Jan 11 2021 at 15:38)</a>:</h4>
<p>ther's a bad way though -- I believe we can <code>cd</code> in a specific directory</p>



<a name="222313100"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313100" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313100">(Jan 11 2021 at 15:39)</a>:</h4>
<p>I don't think there would really be a way to run <code>cargo check</code> in a way that works in this workspace, other than running it once for each facade crate</p>



<a name="222313169"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313169" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313169">(Jan 11 2021 at 15:39)</a>:</h4>
<p>(just <code>-p</code> won't work, because cargo is horrible and cwd matters)</p>



<a name="222313188"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313188" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313188">(Jan 11 2021 at 15:39)</a>:</h4>
<p>hmm, I tried opening just <code>nrf-hal-common</code> in VS Code but the same happened, it's still looking at the whole workspace config</p>



<a name="222313291"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313291" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313291">(Jan 11 2021 at 15:40)</a>:</h4>
<p><span class="user-mention silent" data-user-id="133169">matklad</span> <a href="#narrow/stream/185405-t-compiler.2Fwg-rls-2.2E0/topic/Overriding.20the.20workspace.20feature.20set/near/222313169">said</a>:</p>
<blockquote>
<p>(just <code>-p</code> won't work, because cargo is horrible and cwd matters)</p>
</blockquote>
<p>Hmm, this does work for <code>cargo check</code> at least, does <code>cargo metadata</code> behave differently?</p>



<a name="222313305"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313305" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313305">(Jan 11 2021 at 15:40)</a>:</h4>
<p>we pass <code>--workspace</code> manually</p>



<a name="222313360"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313360" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313360">(Jan 11 2021 at 15:40)</a>:</h4>
<blockquote>
<p>Hmm, this does work for cargo check at least, does cargo metadata behave differently?</p>
</blockquote>



<a name="222313447"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313447" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313447">(Jan 11 2021 at 15:41)</a>:</h4>
<p>not entirely -- it'll also unify-in features of the package in cwd</p>



<a name="222313490"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313490" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313490">(Jan 11 2021 at 15:41)</a>:</h4>
<p>this is no-op in virtual manifests thougt</p>



<a name="222313678"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313678" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313678">(Jan 11 2021 at 15:42)</a>:</h4>
<p>so yeah, I believe we need to add code for "run <code>cargo metadata</code> many times and unify crate graphs"</p>



<a name="222313758"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313758" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313758">(Jan 11 2021 at 15:43)</a>:</h4>
<p><span class="user-mention silent" data-user-id="133169">matklad</span> <a href="#narrow/stream/185405-t-compiler.2Fwg-rls-2.2E0/topic/Overriding.20the.20workspace.20feature.20set/near/222313447">said</a>:</p>
<blockquote>
<p>not entirely -- it'll also unify-in features of the package in cwd</p>
</blockquote>
<p>oh wow you're right, how odd</p>



<a name="222313904"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313904" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Jonas Schievink  [he/him] <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313904">(Jan 11 2021 at 15:44)</a>:</h4>
<p>not looking forward to these kinds of changes, they'll probably break r-a for many users and increase memory usage a lot in some cases <span aria-label="sweat smile" class="emoji emoji-1f605" role="img" title="sweat smile">:sweat_smile:</span></p>



<a name="222313910"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313910" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313910">(Jan 11 2021 at 15:44)</a>:</h4>
<p><a href="https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/project_model/src/workspace.rs#L294-L444">https://github.com/rust-analyzer/rust-analyzer/blob/master/crates/project_model/src/workspace.rs#L294-L444</a></p>



<a name="222313990"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222313990" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222313990">(Jan 11 2021 at 15:45)</a>:</h4>
<p>this the "bit" where "unify metadatas" thing needs to happen</p>



<a name="222314032"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222314032" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222314032">(Jan 11 2021 at 15:45)</a>:</h4>
<blockquote>
<p>not looking forward to these kinds of changes, they'll probably break r-a for many users and increase memory usage a lot in some cases <span aria-label="sweat smile" class="emoji emoji-1f605" role="img" title="sweat smile">:sweat_smile:</span></p>
</blockquote>



<a name="222314084"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222314084" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222314084">(Jan 11 2021 at 15:45)</a>:</h4>
<p>I mean, they'll be opt-in</p>



<a name="222314272"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222314272" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222314272">(Jan 11 2021 at 15:46)</a>:</h4>
<p>I imagine you could extend <code>linkedProjects</code> section to include full cargo command</p>



<a name="222314372"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222314372" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222314372">(Jan 11 2021 at 15:47)</a>:</h4>
<p>so, for nrf-hal, you'll link each of the crates</p>



<a name="222314493"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/185405-t-compiler/rust-analyzer/topic/Overriding%20the%20workspace%20feature%20set/near/222314493" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> matklad <a href="https://rust-lang.github.io/zulip_archive/stream/185405-t-compiler/rust-analyzer/topic/Overriding.20the.20workspace.20feature.20set.html#222314493">(Jan 11 2021 at 15:48)</a>:</h4>
<p>actually, without "and unify crate graph", this should be easy to pull off</p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>